/**
 * @description new 一个对象的过程
 * 1. 创建一个空对象obj，继承构造函数的原型
 * 2. 执行构造函数（将obj作为this）
 * 3. 返回obj
 */

function customNew<T>(constructor: Function, ...args: any[]): T {
  // 1. 创建一个空对象，继承constructor原型
  const obj = Object.create(constructor.prototype);
  // 2. 将obj作为this，执行构造函数，传入参数
  constructor.apply(obj, args);
  // 3. 返回对象
  return obj;
}

class Foo{
    // 属性
    name: string;
    sex: 'male' | 'female';

    constructor(name, sex){
        this.name = name;
        this.sex = sex;
    }

    getName(){
        return this.name;
    }
}

// const foo = new Foo('jeff', 'male');
const foo = customNew<Foo>(Foo, 'jeff.feng', 'female')

console.log(foo.getName());